@@ -5,6 +5,7 @@ from __future__ import division  | 
            ||
| 5 | 5 | 
                from curtail_uuid import CurtailUUID  | 
            
| 6 | 6 | 
                from django.contrib.auth.hashers import check_password  | 
            
| 7 | 7 | 
                from django.db import transaction  | 
            
| 8 | 
                +from filemd5 import calculate_md5  | 
            |
| 8 | 9 | 
                from isoweek import Week  | 
            
| 9 | 10 | 
                from logit import logit  | 
            
| 10 | 11 | 
                from paginator import pagination  | 
            
                @@ -184,34 +185,38 @@ def lensman_photo_upload_api(request):  | 
            ||
| 184 | 185 | 
                photo.save()  | 
            
| 185 | 186 | 
                 | 
            
| 186 | 187 | 
                # 写 GroupPhotoInfo 表  | 
            
| 187 | 
                - group_photo = GroupPhotoInfo.objects.create(  | 
            |
| 188 | 
                + group_photo, created = GroupPhotoInfo.objects.get_or_create(  | 
            |
| 188 | 189 | 
                group_id=group_id,  | 
            
| 189 | 190 | 
                user_id=user_id,  | 
            
| 190 | 
                - nickname=user.final_nickname,  | 
            |
| 191 | 
                - avatar=user.avatar,  | 
            |
| 192 | 
                - photo_path=photo_info.photo_path,  | 
            |
| 193 | 
                - photo_w=photo_info.photo_w,  | 
            |
| 194 | 
                - photo_h=photo_info.photo_h,  | 
            |
| 195 | 
                - photo_thumbnail_path=photo_info.photo_thumbnail_path,  | 
            |
| 196 | 
                - photo_thumbnail_w=photo_info.photo_thumbnail_w,  | 
            |
| 197 | 
                - photo_thumbnail_h=photo_info.photo_thumbnail_h,  | 
            |
| 198 | 
                - photo_thumbnail2_path=photo_info.photo_thumbnail2_path,  | 
            |
| 199 | 
                - photo_thumbnail2_w=photo_info.photo_thumbnail2_w,  | 
            |
| 200 | 
                - photo_thumbnail2_h=photo_info.photo_thumbnail2_h,  | 
            |
| 201 | 
                - photo_from=GroupPhotoInfo.SESSION_GROUP,  | 
            |
| 202 | 
                - session_id=photo.session_id,  | 
            |
| 203 | 
                - lensman_id=photo.lensman_id,  | 
            |
| 204 | 
                - lensman_photo_id=photo.photo_id,  | 
            |
| 191 | 
                + photo_md5=photo_info.photo_md5,  | 
            |
| 192 | 
                +            defaults={
               | 
            |
| 193 | 
                + 'nickname': user.final_nickname,  | 
            |
| 194 | 
                + 'avatar': user.avatar,  | 
            |
| 195 | 
                + 'photo_path': photo_info.photo_path,  | 
            |
| 196 | 
                + 'photo_w': photo_info.photo_w,  | 
            |
| 197 | 
                + 'photo_h': photo_info.photo_h,  | 
            |
| 198 | 
                + 'photo_thumbnail_path': photo_info.photo_thumbnail_path,  | 
            |
| 199 | 
                + 'photo_thumbnail_w': photo_info.photo_thumbnail_w,  | 
            |
| 200 | 
                + 'photo_thumbnail_h': photo_info.photo_thumbnail_h,  | 
            |
| 201 | 
                + 'photo_thumbnail2_path': photo_info.photo_thumbnail2_path,  | 
            |
| 202 | 
                + 'photo_thumbnail2_w': photo_info.photo_thumbnail2_w,  | 
            |
| 203 | 
                + 'photo_thumbnail2_h': photo_info.photo_thumbnail2_h,  | 
            |
| 204 | 
                + 'photo_from': GroupPhotoInfo.SESSION_GROUP,  | 
            |
| 205 | 
                + 'session_id': photo.session_id,  | 
            |
| 206 | 
                + 'lensman_id': photo.lensman_id,  | 
            |
| 207 | 
                + 'lensman_photo_id': photo.photo_id,  | 
            |
| 208 | 
                + }  | 
            |
| 205 | 209 | 
                )  | 
            
| 206 | 210 | 
                 | 
            
| 207 | 
                - # 设置群组最后一张照片PK  | 
            |
| 208 | 
                - r.set(GROUP_LAST_PHOTO_PK % group_id, group_photo.pk)  | 
            |
| 211 | 
                + if created:  | 
            |
| 212 | 
                + # 设置群组最后一张照片PK  | 
            |
| 213 | 
                + r.set(GROUP_LAST_PHOTO_PK % group_id, group_photo.pk)  | 
            |
| 209 | 214 | 
                 | 
            
| 210 | 
                - # 更新今日上传照片数量  | 
            |
| 211 | 
                - r.incr(TODAY_UPLOAD_PHOTO_AMOUNT % (user_id, tc.local_string(format='%Y%m%d')))  | 
            |
| 215 | 
                + # 更新今日上传照片数量  | 
            |
| 216 | 
                + r.incr(TODAY_UPLOAD_PHOTO_AMOUNT % (user_id, tc.local_string(format='%Y%m%d')))  | 
            |
| 212 | 217 | 
                 | 
            
| 213 | 
                - # Redis 群组数据缓存  | 
            |
| 214 | 
                - set_group_info_by_id(group_id)  | 
            |
| 218 | 
                + # Redis 群组数据缓存  | 
            |
| 219 | 
                + set_group_info_by_id(group_id)  | 
            |
| 215 | 220 | 
                 | 
            
| 216 | 221 | 
                     return response(200, 'Lensman Upload Photo Success', u'摄影师照片上传成功', {
               | 
            
| 217 | 222 | 
                'group_id': group_id,  | 
            
                @@ -0,0 +1,19 @@  | 
            ||
| 1 | 
                +# -*- coding: utf-8 -*-  | 
            |
| 2 | 
                +from __future__ import unicode_literals  | 
            |
| 3 | 
                +  | 
            |
| 4 | 
                +from django.db import models, migrations  | 
            |
| 5 | 
                +  | 
            |
| 6 | 
                +  | 
            |
| 7 | 
                +class Migration(migrations.Migration):  | 
            |
| 8 | 
                +  | 
            |
| 9 | 
                + dependencies = [  | 
            |
| 10 | 
                +        ('group', '0030_groupinfo_gather_location'),
               | 
            |
| 11 | 
                + ]  | 
            |
| 12 | 
                +  | 
            |
| 13 | 
                + operations = [  | 
            |
| 14 | 
                + migrations.AddField(  | 
            |
| 15 | 
                + model_name='groupphotoinfo',  | 
            |
| 16 | 
                + name='photo_md5',  | 
            |
| 17 | 
                + field=models.CharField(max_length=255, blank=True, help_text='\u7167\u7247 MD5', null=True, verbose_name='photo_md5', db_index=True),  | 
            |
| 18 | 
                + ),  | 
            |
| 19 | 
                + ]  | 
            
                @@ -213,6 +213,8 @@ class GroupPhotoInfo(CreateUpdateMixin):  | 
            ||
| 213 | 213 | 
                nickname = models.CharField(_(u'nickname'), max_length=255, blank=True, null=True, help_text=u'用户群组昵称')  | 
            
| 214 | 214 | 
                avatar = models.CharField(_(u'avatar'), max_length=255, blank=True, null=True, help_text=u'用户头像')  | 
            
| 215 | 215 | 
                 | 
            
| 216 | 
                + photo_md5 = models.CharField(_(u'photo_md5'), max_length=255, blank=True, null=True, help_text=u'照片 MD5', db_index=True)  | 
            |
| 217 | 
                +  | 
            |
| 216 | 218 | 
                photo_path = models.CharField(_(u'photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径')  | 
            
| 217 | 219 | 
                photo_w = models.IntegerField(_(u'photo_w'), default=0, help_text=u'照片宽度')  | 
            
| 218 | 220 | 
                photo_h = models.IntegerField(_(u'photo_h'), default=0, help_text=u'照片高度')  | 
            
                @@ -285,27 +285,31 @@ def flyimg_upload_api(request):  | 
            ||
| 285 | 285 | 
                photo_info = file_save(photo, prefix='fly', ext='jpeg', thumbnail=True)  | 
            
| 286 | 286 | 
                 | 
            
| 287 | 287 | 
                # 群组照片记录创建  | 
            
| 288 | 
                - group_photo = GroupPhotoInfo.objects.create(  | 
            |
| 288 | 
                + group_photo, created = GroupPhotoInfo.objects.get_or_create(  | 
            |
| 289 | 289 | 
                group_id=group_id,  | 
            
| 290 | 290 | 
                user_id=user_id,  | 
            
| 291 | 
                - nickname=nickname or user.final_nickname,  | 
            |
| 292 | 
                - avatar=user.avatar,  | 
            |
| 293 | 
                - photo_path=photo_info.photo_path,  | 
            |
| 294 | 
                - photo_w=photo_info.photo_w,  | 
            |
| 295 | 
                - photo_h=photo_info.photo_h,  | 
            |
| 296 | 
                - photo_thumbnail_path=photo_info.photo_thumbnail_path,  | 
            |
| 297 | 
                - photo_thumbnail_w=photo_info.photo_thumbnail_w,  | 
            |
| 298 | 
                - photo_thumbnail_h=photo_info.photo_thumbnail_h,  | 
            |
| 299 | 
                - photo_thumbnail2_path=photo_info.photo_thumbnail2_path,  | 
            |
| 300 | 
                - photo_thumbnail2_w=photo_info.photo_thumbnail2_w,  | 
            |
| 301 | 
                - photo_thumbnail2_h=photo_info.photo_thumbnail2_h,  | 
            |
| 291 | 
                + photo_md5=photo_info.photo_md5,  | 
            |
| 292 | 
                +            defaults={
               | 
            |
| 293 | 
                + 'nickname': nickname or user.final_nickname,  | 
            |
| 294 | 
                + 'avatar': user.avatar,  | 
            |
| 295 | 
                + 'photo_path': photo_info.photo_path,  | 
            |
| 296 | 
                + 'photo_w': photo_info.photo_w,  | 
            |
| 297 | 
                + 'photo_h': photo_info.photo_h,  | 
            |
| 298 | 
                + 'photo_thumbnail_path': photo_info.photo_thumbnail_path,  | 
            |
| 299 | 
                + 'photo_thumbnail_w': photo_info.photo_thumbnail_w,  | 
            |
| 300 | 
                + 'photo_thumbnail_h': photo_info.photo_thumbnail_h,  | 
            |
| 301 | 
                + 'photo_thumbnail2_path': photo_info.photo_thumbnail2_path,  | 
            |
| 302 | 
                + 'photo_thumbnail2_w': photo_info.photo_thumbnail2_w,  | 
            |
| 303 | 
                + 'photo_thumbnail2_h': photo_info.photo_thumbnail2_h,  | 
            |
| 304 | 
                + }  | 
            |
| 302 | 305 | 
                )  | 
            
| 303 | 306 | 
                 | 
            
| 304 | 
                - # 设置群组最后一张照片PK  | 
            |
| 305 | 
                - r.set(GROUP_LAST_PHOTO_PK % group_id, group_photo.pk)  | 
            |
| 307 | 
                + if created:  | 
            |
| 308 | 
                + # 设置群组最后一张照片PK  | 
            |
| 309 | 
                + r.set(GROUP_LAST_PHOTO_PK % group_id, group_photo.pk)  | 
            |
| 306 | 310 | 
                 | 
            
| 307 | 
                - # Redis 群组数据缓存  | 
            |
| 308 | 
                - set_group_info_by_id(group_id)  | 
            |
| 311 | 
                + # Redis 群组数据缓存  | 
            |
| 312 | 
                + set_group_info_by_id(group_id)  | 
            |
| 309 | 313 | 
                 | 
            
| 310 | 314 | 
                curinfo = get_current_photos(group_id, user_id, group_user.current_id, request=request)  | 
            
| 311 | 315 | 
                 | 
            
                @@ -9,7 +9,7 @@ TimeConvert==1.3.12  | 
            ||
| 9 | 9 | 
                cryptography==1.5.2  | 
            
| 10 | 10 | 
                django-curtail-uuid==1.0.0  | 
            
| 11 | 11 | 
                django-detect==1.0.5  | 
            
| 12 | 
                -django-file-md5==1.0.0  | 
            |
| 12 | 
                +django-file-md5==1.0.1  | 
            |
| 13 | 13 | 
                django-ip==1.0.0  | 
            
| 14 | 14 | 
                django-json-response==1.1.4  | 
            
| 15 | 15 | 
                django-logit==1.0.6  | 
            
                @@ -29,12 +29,14 @@ def file_save(file_=None, file_path=None, prefix='img', ext='jpeg', watermark=Fa  | 
            ||
| 29 | 29 | 
                # Ext  | 
            
| 30 | 30 | 
                ext = os.path.splitext(file_.name)[-1] or ext  | 
            
| 31 | 31 | 
                 | 
            
| 32 | 
                + # Photo MD5  | 
            |
| 33 | 
                + photo_md5 = calculate_md5(file_)  | 
            |
| 34 | 
                +  | 
            |
| 32 | 35 | 
                # Photo UUID Get or Create  | 
            
| 33 | 
                - photo, created = PhotoUUIDInfo.objects.select_for_update().get_or_create(photo_md5=calculate_md5(file_))  | 
            |
| 36 | 
                + photo, created = PhotoUUIDInfo.objects.select_for_update().get_or_create(photo_md5=photo_md5)  | 
            |
| 34 | 37 | 
                 | 
            
| 35 | 38 | 
                # 照片路径  | 
            
| 36 | 
                - photo_path = photo.photo_path  | 
            |
| 37 | 
                - if not photo_path:  | 
            |
| 39 | 
                + if not photo.photo_path:  | 
            |
| 38 | 40 | 
                         photo_path = '{}/{}{}'.format(prefix, shortuuid.uuid(), ext)
               | 
            
| 39 | 41 | 
                if default_storage.exists(photo_path):  | 
            
| 40 | 42 | 
                default_storage.delete(photo_path)  | 
            
                @@ -88,7 +90,9 @@ def file_save(file_=None, file_path=None, prefix='img', ext='jpeg', watermark=Fa  | 
            ||
| 88 | 90 | 
                     return DotDict({
               | 
            
| 89 | 91 | 
                'ext': ext,  | 
            
| 90 | 92 | 
                 | 
            
| 91 | 
                - 'photo_path': photo_path,  | 
            |
| 93 | 
                + 'photo_md5': photo_md5,  | 
            |
| 94 | 
                +  | 
            |
| 95 | 
                + 'photo_path': photo.photo_path,  | 
            |
| 92 | 96 | 
                'photo_w': photo.photo_w,  | 
            
| 93 | 97 | 
                'photo_h': photo.photo_h,  | 
            
| 94 | 98 | 
                 |